﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

using Canroc.Net.Application.SysSequenceRuleService.Dto;

// ReSharper disable once CheckNamespace
namespace Canroc.Net.Application.SysSequenceRuleService;

/// <summary>
///     序列规则应用服务
/// </summary>
[ApiDescriptionSettings("System")]
public partial class SysSequenceRuleAppService(SqlSugarRepository<SysSequenceRule> sysSequenceRuleRep)
    : IDynamicApiController, ITransient
{
    /// <summary>
    ///     添加序列规则
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> AdditionAsync(SequenceRuleInput data)
    {
        var entity = data.Adapt<SysSequenceRule>();
        return await sysSequenceRuleRep.InsertAsync(entity);
    }

    /// <summary>
    ///     编辑序列规则
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> EditAsync(SequenceRuleInput data)
    {
        var entity = await sysSequenceRuleRep.GetByIdAsync(data.Id);
        data.Adapt(entity);
        return await sysSequenceRuleRep.UpdateAsync(entity);
    }

    /// <summary>
    ///     启用/禁用序列规则
    /// </summary>
    /// <param name="data">请求参数</param>
    /// <returns></returns>
    public async Task<bool> EnableAsync(InputModel data)
    {
        return await sysSequenceRuleRep.UpdateAsync(
            s => new SysSequenceRule { IsEnable = SqlFunc.IIF(s.IsEnable, false, true) }, s => s.Id == data.Id);
    }

    /// <summary>
    ///     删除序列规则
    /// </summary>
    /// <param name="data">请求参数</param>
    /// <returns></returns>
    public async Task<bool> DelAsync(DeleteInputModel data)
    {
        return await sysSequenceRuleRep.UpdateAsync(s => new SysSequenceRule { IsDelete = true },
            s => data.Ids.Contains(s.Id));
    }

    /// <summary>
    ///     获取序列规则
    /// </summary>
    /// <param name="id">主键</param>
    /// <returns></returns>
    public async Task<SequenceRuleOutput?> GetDataAsync(Guid id)
    {
        return await sysSequenceRuleRep.AsQueryable().Where(s => s.Id == id).Select<SequenceRuleOutput>()
            .FirstAsync();
    }

    /// <summary>
    ///     分页: 序列规则集合
    /// </summary>
    /// <param name="query">请求参数</param>
    /// <returns></returns>
    public async Task<PageModel<SequenceRuleOutput>> GetPageAsync([FromQuery] SequenceRulePageQuery query)
    {
        return await sysSequenceRuleRep
            .AsQueryable()
            .Where(r => r.SequenceId == query.SequenceId)
            .WhereIF(query.IsEnable.HasValue, r => r.IsEnable == query.IsEnable)
            .OrderByPropertyName(query.OrderField, query.IsAscending ? OrderByType.Asc : OrderByType.Desc)
            .Select<SequenceRuleOutput>()
            .ToPageAsync(query.PageIndex, query.PageSize);
    }
}